package com.xinke.module.system.mapper.oauth2;

import com.xinke.component.common.pojo.PageResult;
import com.xinke.component.mybatis.mybatis.core.query.LambdaQueryWrapperExt;
import com.xinke.component.mybatis.mybatis.core.mapper.BaseMapperExt;
import com.xinke.component.tenant.core.aop.TenantIgnore;
import com.xinke.module.system.model.entity.oauth2.OAuth2AccessTokenDO;
import org.apache.ibatis.annotations.Mapper;
import com.xinke.module.system.model.vo.oauth2.*;

/**
 * OAuth2 访问令牌 Mapper
 *
 * @author yzx
 */
@Mapper
public interface OAuth2AccessTokenMapper extends BaseMapperExt<OAuth2AccessTokenDO> {

    default PageResult<OAuth2AccessTokenDO> selectPage(OAuth2AccessTokenPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperExt<OAuth2AccessTokenDO>()
                .eqIfPresent(OAuth2AccessTokenDO::getUserId, reqVO.getUserId())
                .eqIfPresent(OAuth2AccessTokenDO::getUserType, reqVO.getUserType())
                .eqIfPresent(OAuth2AccessTokenDO::getUserInfo, reqVO.getUserInfo())
                .eqIfPresent(OAuth2AccessTokenDO::getAccessToken, reqVO.getAccessToken())
                .eqIfPresent(OAuth2AccessTokenDO::getRefreshToken, reqVO.getRefreshToken())
                .eqIfPresent(OAuth2AccessTokenDO::getClientNo, reqVO.getClientNo())
                .eqIfPresent(OAuth2AccessTokenDO::getAuthScope, reqVO.getAuthScope())
                .betweenIfPresent(OAuth2AccessTokenDO::getExpiresTime, reqVO.getExpiresTime())
                .orderByDesc(OAuth2AccessTokenDO::getTokenId));
    }

    @TenantIgnore // 获取 token 的时候，需要忽略租户编号。原因是：一些场景下，可能不会传递 tenant-id 请求头，例如说文件上传、积木报表等等
    default OAuth2AccessTokenDO selectByAccessToken(String accessToken) {
        return selectOne(OAuth2AccessTokenDO::getAccessToken, accessToken);
    }
}